﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace pictureAnalyse
{
    /// <summary>
    /// 文件拖拽处理基础类，获取通过拖拽方式载入的文件路径信息
    /// 在界面中添加一个TextBox控件，或其他支持拖拽属性的控件。
    /// 设置其AllowDrop属性为ture，添加DragEnter、DragDrop事件响应逻辑
    /// http://blog.csdn.net/scimence/article/details/44827959http://blog.csdn.net/scimence/article/details/44827959
    /// </summary>
    class FileDrag
    {
        public static void Form_DragEnter(object sender, DragEventArgs e)
        {
            dragEnter(e);
        }

        public static void Form_DragDrop(object sender, DragEventArgs e)
        {
            TextBox textBox = sender as TextBox;
            textBox.Text = dragDrop(e);
        }

        /// <summary>  
        /// 文件拖进事件处理：  
        /// </summary>  
        public static void dragEnter(DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))    //判断拖来的是否是文件  
                e.Effect = DragDropEffects.Link;                //是则将拖动源中的数据连接到控件  
            else e.Effect = DragDropEffects.None;
        }

        /// <summary>  
        /// 文件放下事件处理：  
        /// 放下, 另外需设置对应控件的 AllowDrop = true;   
        /// 获取的文件名形如 "d:\1.txt;d:\2.txt"  
        /// </summary>  
        public static string dragDrop(DragEventArgs e)
        {
            StringBuilder filesName = new StringBuilder("");
            Array file = (System.Array)e.Data.GetData(DataFormats.FileDrop);//将拖来的数据转化为数组存储  

            foreach (object I in file)
            {
                string str = I.ToString();

                System.IO.FileInfo info = new System.IO.FileInfo(str);
                //若为目录，则获取目录下所有子文件名  
                if ((info.Attributes & System.IO.FileAttributes.Directory) != 0)
                {
                    str = getAllFiles(str);
                    if (!str.Equals("")) filesName.Append((filesName.Length == 0 ? "" : ";") + str);
                }
                //若为文件，则获取文件名  
                else if (System.IO.File.Exists(str))
                    filesName.Append((filesName.Length == 0 ? "" : ";") + str);
            }

            return filesName.ToString();
        }

        /// <summary>  
        /// 判断path是否为目录  
        /// </summary>  
        public static bool IsDirectory(String path)
        {
            System.IO.FileInfo info = new System.IO.FileInfo(path);
            return (info.Attributes & System.IO.FileAttributes.Directory) != 0;
        }

        /// <summary>  
        /// 获取目录path下所有子文件名  
        /// </summary>  
        public static string getAllFiles(String path)
        {
            StringBuilder str = new StringBuilder("");
            if (System.IO.Directory.Exists(path))
            {
                //所有子文件名  
                string[] files = System.IO.Directory.GetFiles(path);
                foreach (string file in files)
                    str.Append((str.Length == 0 ? "" : ";") + file);

                //所有子目录名  
                string[] Dirs = System.IO.Directory.GetDirectories(path);
                foreach (string dir in Dirs)
                {
                    string tmp = getAllFiles(dir);  //子目录下所有子文件名  
                    if (!tmp.Equals("")) str.Append((str.Length == 0 ? "" : ";") + tmp);
                }
            }
            return str.ToString();
        }  
    }
}
